// 应用架构服务层，用于管理整体架构和服务连接
import { getDataService } from './DataService';
import { DataProcessor } from './DataProcessor';
import Logger from '../utils/Logger';

/**
 * 应用服务管理器，管理所有服务的生命周期和依赖关系
 */
export class AppService {
  constructor() {
    Logger.info('AppService', '初始化应用服务管理器');
    this.isInitialized = false;
    this.services = {};
  }

  /**
   * 初始化所有服务
   */
  async initialize() {
    if (this.isInitialized) {
      Logger.info('AppService', '应用服务已经初始化');
      return;
    }

    try {
      Logger.info('AppService', '开始初始化应用服务');
      
      // 初始化各服务
      await this.initializeServices();
      
      // 建立服务间的依赖关系
      this.setupServiceDependencies();
      
      this.isInitialized = true;
      Logger.info('AppService', '应用服务初始化完成');
    } catch (error) {
      Logger.error('AppService', '应用服务初始化失败: ' + JSON.stringify(error));
      throw error;
    }
  }

  /**
   * 初始化各服务
   */
  async initializeServices() {
    // 初始化数据服务
    const dataService = getDataService();
    this.services.dataService = dataService;
    Logger.info('AppService', '数据服务初始化完成');
  }

  /**
   * 建立服务间的依赖关系
   */
  setupServiceDependencies() {
    // 这里可以设置服务间的依赖关系
    // 例如：数据服务可以依赖于配置服务
    Logger.info('AppService', '服务依赖关系建立完成');
  }

  /**
   * 获取指定服务
   * @param {string} serviceName - 服务名称
   * @returns {Object|null} 服务实例或null
   */
  getService(serviceName) {
    return this.services[serviceName] || null;
  }

  /**
   * 获取数据服务
   * @returns {Object} 数据服务实例
   */
  getDataService() {
    return this.services.dataService;
  }

  /**
   * 获取数据处理器
   * @returns {Object} 数据处理器
   */
  getDataProcessor() {
    return DataProcessor;
  }

  /**
   * 清理资源，在应用退出时调用
   */
  cleanup() {
    Logger.info('AppService', '清理应用服务资源');
    // 清理各服务的资源
    this.services = {};
    this.isInitialized = false;
  }
}

// 应用服务单例
let appServiceInstance = null;

/**
 * 获取应用服务实例
 * @returns {AppService} 应用服务单例
 */
export function getAppService() {
  if (!appServiceInstance) {
    appServiceInstance = new AppService();
  }
  return appServiceInstance;
}